from selenium.webdriver.common.by import By
from selenium.webdriver.remote.webdriver import WebDriver
from selenium.webdriver.remote.webelement import WebElement
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait


class LoginPage:
    # 把登录页抽象成一个类，把页面中的元素定位设计成类的属性
    # 页面中的元素操作设计成类的方法
    URL = 'https://svr-6-9010.share.51env.net/accounts/login/'
    username_input_loc = (By.ID, 'id_login')
    password_input_loc = (By.ID, 'id_password')
    captcha_input_loc = (By.ID, 'id_captcha_1')
    login_button_loc = (By.CLASS_NAME, 'primaryAction')
    login_success_msg = (By.CLASS_NAME, 'alert.success.alert-dismissible')

    # driver浏览器才conftest创建好的，不需要再创建
    # 所以创建一个构造方法，当实例化这个类，从测试用例方法中传入
    def __init__(self, driver: WebDriver):
        self.driver = driver

    def open(self):
        self.driver.get(self.URL)

    def input_username(self):
        # *:拆开元组，把每个元素作为一个方法的参数传入
        # self.driver.find_element(*self.username_input_loc).send_keys('1464233801@qq.com')
        self.send_keys(*self.username_input_loc, '1464233801@qq.com')

    def input_password(self):
        # self.driver.find_element(*self.password_input_loc).send_keys('bj0304BJA')
        self.send_keys(*self.password_input_loc, 'bj0304BJA')

    def input_captcha(self):
        # self.driver.find_element(*self.captcha_input_loc).send_keys('passed')
        self.send_keys(*self.captcha_input_loc, 'passed')

    def click_button(self):
        # self.driver.find_element(*self.login_button_loc).click()
        self.click(*self.login_button_loc)

    def assert_login_success(self):
        # success_text = self.driver.find_element(*self.login_success_msg).text
        success_text = self.find_element(*self.login_success_msg).text
        assert '以 lllljl..身份成功登录' in success_text

    def login(self):
        self.open()
        self.input_username()
        self.input_password()
        self.input_captcha()
        self.click_button()
        self.assert_login_success()

    # 比如我们做修改功能时，有些输入框中是有默认值的，所以最好每次send_keys都自动进行一次clear
    # 比如，我们前面讲了显示等待。有些元素是在页面加载完成后，因为某些操作通过javascript触发出来的#比如提交评论后，页面没有刷新，但是会出现一个一闪而逝的提示信息，
    # 用time.sleep()等的时间短可能没出现，等的时间长可能消失了
    # 而且time.sleep()的执行效率比较低，经常会浪费一些等待时间
    # 所以最好每次元素定位，都采用显示等待的方式定位，提高自动测试的稳定性的同时，兼顾了执行的效率
    # #所以我们需要自己声明一个find_element()在方法中实现显示等待，代替selenium源码中提供的find_element()方法
    # -> ：声明返回值类型
    def find_element(self, by, value) -> WebElement:
        return WebDriverWait(self.driver, 20, 0.5).until(lambda x: x.find_element(by, value))
        # return WebDriverWait(self.driver, 20, 0.5).until(expected_conditions.visibility_of_element_located((by, value)))

    def send_keys(self, by, value, keys):
        element = self.find_element(by, value)
        element.clear()
        element.send_keys(keys)

    def click(self, by, value):
        self.find_element(by, value).click()
